package com.cskaoyan.javase.oop1._7constructor._0introduction;

/**
 * 构造器的引入:
 * 创建一个教师类，有课程和年龄两个属性，行为是可以上课。
 * 现在我们需要创建以下对象：
 * 18岁的Java老师对象
 * 28岁的C++老师对象
 * 30岁的Python老师对象
 * ...
 * 按照之前我们的做法，需要先创建出对象，再进行成员变量的赋值。
 * 这样做如果只有一个两个对象还好，如果需要创建很多对象，就有点过于麻烦了。
 * 对象的属性，能不能"出厂"的时候就设定好呢？
 * 有这种需求时，就需要，构造方法（constructor，也叫构造器）来完成了。
 *
 * 构造器的语法:
 * [访问权限修饰符] 类名(形参列表){
 *   // 构造方法体
 * }
 * 解释:
 * 1.访问权限修饰符我们还没有学习，这里我们默认它是public修饰的。
 * 2.构造方法返回值类型位置,写的是类名,这个地方必须和当前类名保持一致,可以认为它是构造器的名字
 * （类名是大驼峰的，构造器的名字也要大驼峰）
 * 构造器不需要返回值,也没有返回值,而且构造方法中不能使用"return"
 * 3.形参列表可以为空，称之为无参构造方法，简称无参构造。当然也可以有参数，是为有参构造。
 * 4.构造方法体，和一般方法类似，可以写语句。
 *      构造方法的方法体和一般成员方法类似,因为在Java当中构造方法的方法体中也隐含了this传参,指向当前对象
 *      构造器中有this,所以就可以访问本类中成员变量和成员方法.
 *
 * 构造器的作用:
 *      在创建对象的过程中,用来给对象的成员变量赋值
 *      构造器的执行,并不是Java程序员手动去调用的(它虽然是一个方法,但是Java程序员不能直接控制它的调用)
 *      在new对象的过程中,JVM就会自动去调用构造方法,来完成成员变量的赋值
 *      虽然不能程序员不能控制JVM去调用构造方法,但是可以指示JVM去调用哪个构造器完成成员变量的赋值
 *      语法:
 *      new 类名/构造器名(实参列表);
 *      根据实参列表的不同,去调用不同的构造器
 *
 * 注:
 *      1.无参构造方法没有传入任何参数,所以无参构造不能完成给成员变量赋值
 *      无参构造器的标准格式:
 *      public 类名(){}
 *
 *      2.有参构造方法传入参数,一个类中的多个构造方法构成方法的重载,有参构造就可以给成员变量赋值
 *      有参构造器的标准格式:
 *      public 类名(形参列表){
 *          this.成员变量名 = 成员变量名;
 *          ...
 *      }
 *      有参的构造器是可以在创建对象过程中,灵活的给成员变量赋值的,是很常用的手段.
 *
 *
 * @since 09:32
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 调用Teacher类的无参构造完成成员变量的赋值
        Teacher t1 = new Teacher();
        t1.age = 18;
        t1.course = "Java";
        t1.teach();

        Teacher t2 = new Teacher();
        t2.age = 28;
        t2.course = "C++";
        t2.teach();

        Teacher t3 = new Teacher();
        t3.age = 38;
        t3.course = "Python";
        t3.teach();

        Teacher t4 = new Teacher(48, "数学");
        t4.teach();

        Teacher t5 = new Teacher(30, "英语");
        t5.teach();
    }
}

class Teacher {
    int age;
    String course;

    public void teach() {
        System.out.println("这个" + age + "岁的老师正在教授" + course);
    }

    // 无参构造方法
    public Teacher() {
    }

    // 有参构造方法
    public Teacher(int age) {
        this.age = age;
    }

    public Teacher(int age, String course) {
        this.age = age;
        this.course = course;
    }

}
